package base

import (
	"hi-jvm/instructions/util"
	"hi-jvm/rtda"
)

type Instruction interface {
	// 从字节码中提取操作数
	FetchOperands(reader *util.BytecodeReader)

	// 执行逻辑指令
	Execute(frame *rtda.Frame)
}

// 为避免重复代码，按照操作数类型定义一些结构体，并实现FetchOperands方法

// 没有操作数的指令
type NoOperandsInstruction struct {}

// 跳转指令
type BranchInstruction struct {
	Offset int
}

// 存储和加载类指令需要根据索引存取局部变量表
type Index8Instruction struct {
	Index uint
}

// 有一些指令访问运行时常量池时，常量池由两个字节操作数给出
type Index16Instruction struct {
	Index uint
}

func (self *NoOperandsInstruction)FetchOperands(reader *util.BytecodeReader) {

}

func (self *BranchInstruction)FetchOperands(reader *util.BytecodeReader) {
	self.Offset = int(reader.ReadInt16())
}

func (self *Index8Instruction)FetchOperands(reader *util.BytecodeReader) {
	self.Index = uint(reader.ReadUInt8())
}

func (self *Index16Instruction)FetchOperands(reader *util.BytecodeReader) {
	self.Index = uint(reader.ReadUInt16())
}